package com.edu.exam.entity.grading.export;

import com.edu.exam.entity.core.AuditableEntity;
import com.edu.exam.enums.grading.export.FormatType;
import com.edu.exam.enums.grading.export.FormatStatus;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 成绩导出格式表实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_export_format</p>
 *
 * <p>成绩导出格式管理表，用于管理各种成绩导出格式的基础信息。
 * 支持多种导出格式的统一管理，包含格式定义、技术参数、
 * 状态管理、使用统计等功能。</p>
 *
 * <p>主要功能特性：</p>
 * <ul>
 *   <li>格式基础信息管理（格式名称、类型、版本等）</li>
 *   <li>技术参数配置（文件扩展名、MIME类型、模板等）</li>
 *   <li>格式状态和生命周期管理</li>
 *   <li>使用统计和性能分析</li>
 *   <li>格式兼容性和依赖管理</li>
 *   <li>安全控制和访问限制</li>
 * </ul>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public class GradeExportFormat extends AuditableEntity {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    /**
     * 格式名称
     */
    @Column(name = "format_name", nullable = false, length = 50)
    String formatName;

    /**
     * 格式代码
     */
    @Column(name = "format_code", nullable = false, unique = true, length = 20)
    String formatCode;

    /**
     * 格式类型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "format_type", nullable = false, length = 20)
    FormatType formatType;

    /**
     * 格式状态
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "format_status", nullable = false, length = 20)
    FormatStatus formatStatus;

    /**
     * 文件扩展名
     */
    @Column(name = "file_extension", nullable = false, length = 10)
    String fileExtension;

    /**
     * MIME类型
     */
    @Column(name = "mime_type", nullable = false, length = 100)
    String mimeType;

    /**
     * 格式版本
     */
    @Column(name = "format_version", length = 20)
    String formatVersion;

    /**
     * 格式描述
     */
    @Column(name = "description", length = 500)
    String description;

    /**
     * 格式图标URL
     */
    @Column(name = "icon_url", length = 200)
    String iconUrl;

    /**
     * 格式模板内容
     */
    @Column(name = "template_content", columnDefinition = "TEXT")
    String templateContent;

    /**
     * 格式样式配置
     */
    @Column(name = "style_config", columnDefinition = "TEXT")
    String styleConfig;

    /**
     * 格式参数配置
     */
    @Column(name = "format_params", columnDefinition = "TEXT")
    String formatParams;

    /**
     * 技术要求配置
     */
    @Column(name = "technical_requirements", columnDefinition = "TEXT")
    String technicalRequirements;

    /**
     * 支持的数据类型
     */
    @Column(name = "supported_data_types", length = 200)
    String supportedDataTypes;

    /**
     * 优先级
     */
    @Column(name = "priority")
    Integer priority;

    /**
     * 是否系统格式
     */
    @Column(name = "is_system", nullable = false)
    Boolean isSystem;

    /**
     * 是否启用
     */
    @Column(name = "is_enabled", nullable = false)
    Boolean isEnabled;

    /**
     * 是否默认格式
     */
    @Column(name = "is_default", nullable = false)
    Boolean isDefault;

    /**
     * 使用次数
     */
    @Column(name = "usage_count")
    Long usageCount;

    /**
     * 平均处理时间（毫秒）
     */
    @Column(name = "avg_processing_time_ms")
    Long avgProcessingTimeMs;

    /**
     * 最大文件大小限制（字节）
     */
    @Column(name = "max_file_size_bytes")
    Long maxFileSizeBytes;

    /**
     * 最大记录数限制
     */
    @Column(name = "max_record_count")
    Integer maxRecordCount;

    /**
     * 格式标签
     */
    @Column(name = "format_tags", length = 200)
    String formatTags;

    /**
     * 兼容性配置
     */
    @Column(name = "compatibility_config", columnDefinition = "TEXT")
    String compatibilityConfig;

    /**
     * 验证规则配置
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    String validationRules;

    /**
     * 依赖格式
     */
    @Column(name = "dependency_formats", length = 200)
    String dependencyFormats;

    /**
     * 性能指标配置
     */
    @Column(name = "performance_metrics", columnDefinition = "TEXT")
    String performanceMetrics;

    /**
     * 安全配置
     */
    @Column(name = "security_config", columnDefinition = "TEXT")
    String securityConfig;

    /**
     * 扩展配置
     */
    @Column(name = "extension_config", columnDefinition = "TEXT")
    String extensionConfig;

    /**
     * 创建人ID
     */
    @Column(name = "creator_id")
    Long creatorId;

    /**
     * 更新人ID
     */
    @Column(name = "updater_id")
    Long updaterId;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    LocalDateTime updateTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    Long version;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    Boolean isDeleted;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    LocalDateTime deleteTime;

    /**
     * 删除人ID
     */
    @Column(name = "deleter_id")
    Long deleterId;

    // ===== 标准审计字段 =====

    /**
     * 创建时间（标准审计字段）
     */
    @CreationTimestamp
    @Column(name = "created_time_audit", nullable = false, updatable = false)
    LocalDateTime createdTimeAudit;

    /**
     * 更新时间（标准审计字段）
     */
    @UpdateTimestamp
    @Column(name = "updated_time_audit", nullable = false)
    LocalDateTime updatedTimeAudit;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version_audit")
    Long versionAudit = 0L;

    /**
     * 逻辑删除标记（标准审计字段）
     */
    @Column(name = "is_deleted_audit", nullable = false)
    Boolean isDeletedAudit = false;

    // ===== 枚举定义 =====

    /**
     * 格式类型枚举
     */
}
